package com.java.tutorials.apache.common.beanutils;

/**
 * Created by xuzhike on 2016/3/5.
 * http://www.java2s.com/Code/Java/Apache-Common/BeanUtilsgetPropertyfromDynamicBeans.htm
 * BeanUtils get Property from Dynamic Beans
 */
import org.apache.commons.beanutils.DynaBean;
import org.apache.commons.beanutils.DynaClass;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.LazyDynaBean;
import org.apache.commons.beanutils.DynaProperty;
import org.apache.commons.beanutils.BasicDynaClass;

import java.util.Map;
import java.util.List;
import java.util.Date;
import java.util.HashMap;
import java.util.GregorianCalendar;

public class DynaBeansExampleV1 {
    public static void main(String args[]) throws Exception {
        Object movie = createMovieBean();
        System.err.println(BeanUtils.getProperty(movie, "title"));
        System.err.println(BeanUtils.getProperty(movie, "director.name"));
    }

    private static Object createMovieBean() throws Exception {

        // first create the properties
        DynaProperty properties[] = new DynaProperty[] {
                new DynaProperty("title", String.class),
                new DynaProperty("dateOfRelease", Date.class),
                new DynaProperty("keywords", String[].class),
                new DynaProperty("genre", Map.class),
                new DynaProperty("actors", List.class),
                new DynaProperty("director", DynaBean.class)
        };

        // next using the properties define the class
        DynaClass movieClass = new BasicDynaClass("movie", null, properties);

        // now, with the class, create a new instance
        DynaBean movieBean = movieClass.newInstance();

        // set its properties
        movieBean.set("title", "The Italian Job");
        movieBean.set("dateOfRelease",
                new GregorianCalendar(1969, 0, 1).getTime());
        movieBean.set("keywords", new String[] {"Italy", "Bank Robbery"});

        Map genre = new HashMap();
        genre.put("THR", "Thriller");

        movieBean.set("genre", genre);
        movieBean.set("genre", "ACT", "Action");

        DynaBean director = createPersonBean();
        director.set("name", "Peter Collinson");
        director.set("gender", new Integer(1));

        movieBean.set("director", director);

        return movieBean;
    }

    private static DynaBean createPersonBean() {
        DynaBean person = new LazyDynaBean();
        return person;
    }
}
